iT邦幫忙

2024 iThome 鐵人賽

DAY 16
0
Odoo

30天就算 0 基礎,也能使用 GenAI 創造簡單的 Odoo 模組應用系列 第 16

【Day16】Odoo ORM 資料操作,簡易電商顧客訂單 增刪查改 (CRUD) 及 複雜關聯查詢 (Join)

  • 分享至 

  • xImage
  •  

Odoo ORM 更適合處理大多數日常應用中的 CRUD 操作,而 SQL 則在性能優化和處理複雜查詢時更加靈活。不囉說,先上精彩的對照表格。

SQL DML vs Odoo ORM 比較表

功能 SQL Odoo ORM
Create INSERT INTO Customers (Name, Address, Phone) VALUES (...) self.env['my_module.customers'].create({...})
Read SELECT * FROM Customers WHERE Name = 'John Doe' self.env['my_module.customers'].search([('name', '=', 'John Doe')])
Update UPDATE Customers SET Phone = '0987654321' WHERE Name = 'John' customer.write({'phone': '0987654321'})
Delete DELETE FROM Customers WHERE Name = 'John Doe' customer.unlink()
Join SELECT ... FROM Customers JOIN Orders ON ... 使用關聯字段 (Many2one, One2many) 自動處理表關聯,通過 order_ids 等獲取相關聯的訂單資料

文章架構

  • 增刪查改 (CRUD)
    • 查詢資料 (Select)
    • 插入資料 (Insert)
    • 更新資料 (Update)
    • 刪除資料 (Delete)
  • 複雜查詢(跨表 JOIN 操作)
    • SQL JOIN 查詢對應的 Odoo ORM API 解釋
      小結
      引用

增刪查改 (CRUD)

一樣我們參考昨天的範例,將原本的 Excel->SQL 對應,延伸至 SQL->Odoo ORM 的應用。
【Day15】零基礎 ERP 關聯式資料庫 (Relational Database):操作表格資料 (DML)

查詢資料 (Select)

SQL 實作

SELECT Name, Phone
FROM Customers
WHERE City = 'Taipei';

Odoo ORM 對應
使用 search 方法來查詢資料。

# 查詢 City 為 'Taipei' 的 Customers
customers = self.env['my_module.customers'].search([('city', '=', 'Taipei')])

# 遍歷查詢結果並打印客戶名稱和電話
for customer in customers:
    print("Name:", customer.name, "Phone:", customer.phone)
  • search([('city', '=', 'Taipei')]):這是 Odoo ORM 用來根據條件查詢客戶的方式,對應到 SQL 中的 WHERE City = 'Taipei'。
  • 遍歷結果:使用 for customer in customers 遍歷結果,並取得 name 和 phone 欄位,類似於 SQL 查詢的 SELECT Name, Phone。

插入資料 (Insert)

SQL 實作

INSERT INTO Customers (CustomerID, CustomerName, Phone)
VALUES (101, 'John Doe', '123456789');

Odoo ORM 對應
使用 create 方法來插入資料。

# 插入客戶資料
new_customer = self.env['customers'].create({
    'customer_id': 101,
    'name': 'John Doe',
    'phone': '123456789'
})

更新資料 (Update)

SQL 實作

UPDATE Customers
SET Phone = '987654321'
WHERE CustomerID = 101;

Odoo ORM 對應
使用 write 方法來更新資料。

# 更新客戶電話
customer = self.env['customers'].search([('customer_id', '=', 101)])
if customer:
    customer.write({'phone': '987654321'})

刪除資料 (Delete)

SQL 實作

DELETE FROM Customers
WHERE CustomerID = 101;

Odoo ORM 對應
使用 unlink 方法來刪除資料。

# 刪除客戶
customer = self.env['customers'].search([('customer_id', '=', 101)])
if customer:
    customer.unlink()

複雜查詢(跨表 JOIN 操作)

SQL 實作

SELECT Customers.CustomerName, Orders.OrderDate
FROM Customers
JOIN Orders ON Customers.CustomerID = Orders.CustomerID;

Odoo ORM 對應

【Day14】運用 Odoo ORM 在資料庫建立,簡易電商顧客訂單模型

from odoo import models, fields

# 定義 Customers 模型
class Customers(models.Model):
    _name = 'my_module.customers'  # 資料庫表名稱
    _description = 'Customers Table'

    customer_id = fields.Integer(string='Customer ID', required=True, index=True)  # 主鍵
    name = fields.Char(string='Name', required=True)  # 客戶名稱
        address = fields.Char(string='Address')  # 客戶地址
        phone = fields.Char(string='Phone')  # 電話

# 定義 Orders 模型
class Orders(models.Model):
    _name = 'my_module.orders'  # 資料庫表名稱
    _description = 'Orders Table'

    order_id = fields.Integer(string='Order ID', required=True, index=True)  # 主鍵
    order_date = fields.Date(string='Order Date')  # 訂單日期
    customer_id = fields.Many2one('my_module.customers', string='Customer', ondelete='cascade')  # 外鍵,關聯到 Customers 表

# 查詢所有 Customers 及其 Orders 資料
customers = self.env['my_module.customers'].search([])

# 遍歷所有 Customers 並取得其 Orders
for customer in customers:
    for order in customer.order_ids:
        print("Customer Name:", customer.name, "Order Date:", order.order_date)
  • search([]):查詢所有 Customers 資料。
  • customer.order_ids:透過 Odoo 的 One2many 關聯,查詢每位客戶的訂單。
  • Odoo ORM 自動處理 JOIN 操作,根據 Many2one 和 One2many 字段在資料庫中進行聯表查詢。

SQL JOIN 查詢對應的 Odoo ORM API 解釋

在 Odoo 17 ORM API 中,SQL 中的 JOIN 通常由 ORM 自動處理,根據模型中的關聯字段(如 Many2one)來實現跨表的資料檢索。對應於 SQL 的 JOIN 操作,可以使用 Odoo 的 search 或 browse 方法來進行多表的關聯查詢。

【Day14】運用 Odoo ORM 在資料庫建立,簡易電商顧客訂單模型

  • SQL JOIN 通常透過 Many2one 和 One2many 關聯實現。
  • Odoo ORM 的 search 和關聯字段(如 order_ids)自動生成 SQL 中的 JOIN 查詢,無需明確撰寫 JOIN 語句。
  • ORM 處理的查詢結果是 Odoo 模型記錄,這些記錄可以直接使用其字段和關聯字段進行數據檢索和操作。

小結

功能 SQL Odoo ORM
Create INSERT INTO Customers (Name, Address, Phone) VALUES (...) self.env['my_module.customers'].create({...})
Read SELECT * FROM Customers WHERE Name = 'John Doe' self.env['my_module.customers'].search([('name', '=', 'John Doe')])
Update UPDATE Customers SET Phone = '0987654321' WHERE Name = 'John' customer.write({'phone': '0987654321'})
Delete DELETE FROM Customers WHERE Name = 'John Doe' customer.unlink()
Join SELECT ... FROM Customers JOIN Orders ON ... 使用關聯字段 (Many2one, One2many) 自動處理表關聯,通過 order_ids 等獲取相關聯的訂單資料
  1. CRUD 操作的基本實現
    在 Odoo ORM 中,CRUD(Create, Read, Update, Delete)操作對應於模型中的四個主要方法:
  2. Odoo ORM 不直接提供 SQL 的 JOIN 語法,但使用關聯字段如 Many2one, One2many, 和 Many2many,ORM 可以自動處理表關聯查詢。

Odoo ORM 雖然不直接使用 SQL 語句,但它通過關聯字段的自動處理和高層次的 API 設計,使得開發者可以更高效地進行 CRUD 和複雜的關聯查詢操作,同時保持數據庫的操作簡單且安全。

引用 Reference

【Day14】運用 Odoo ORM 在資料庫建立,簡易電商顧客訂單模型

【Day15】零基礎 ERP 關聯式資料庫 (Relational Database):操作表格資料 (DML)


上一篇
【Day15】零基礎 ERP 關聯式資料庫 (Relational Database):操作表格資料 (DML)
下一篇
【Day17】Odoo ORM 之 SQL 進階功能對應
系列文
30天就算 0 基礎,也能使用 GenAI 創造簡單的 Odoo 模組應用21
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言